package com.lsismo.core.base.service;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 业务层接口 
 *
 *
 * @see com.einvite.service.GenericManager
 */
public interface UniversalManager {
    /**
     * 获得所有的对象
     * @param clazz 对象的类型
     * @return 对象列表
     */
    @SuppressWarnings("unchecked")
	List getAll(Class clazz);
    
    /**
     * 通过id获得对象 
     * 
     * @param clazz 要查找的类型
     * @param id 唯一标志符
     * @return 得到的对象
     * @see org.springframework.orm.ObjectRetrievalFailureException
     */
    @SuppressWarnings("unchecked")
    Object get(Class clazz, Serializable id);
    
    /**
     * 通过id检查对象是否存在
     * @param clazz 要查找的类型
     * @param id 要获取对象的唯一标志符
     * @return - 存在返回true，不存在返回false
     */
    @SuppressWarnings("unchecked")
    boolean exists(Class clazz, Serializable id);

    /**
     * 保存对象
     * @param o 要保存的对象
     * @return 保存后的对象
     */
    Object save(Object o);

    /**
     * 通过id删除对象
     * @param clazz 要删除的类型
     * @param id 唯一标志符
     */
    @SuppressWarnings("unchecked")
    void remove(Class clazz, Serializable id);
    
    /**
     * 该方法用于基于实例删除对象
     * @param object 要删除对象
     */
    void remove(Object o);
    
    /**
     * 该方法用于依据给定的实例查找对象
     * @param object
     * @return 符合条件的对象List
     */
    @SuppressWarnings("unchecked")
    List findByExample(Object o);
    
    /**
     * 该方法用语依据给定的属性查询
     * @param propertyName
     * @param value
     * @return
     */
    @SuppressWarnings("unchecked")
    List findByProperty(Class clazz, String propertyName, Object value);
    
    /**
     * 该方法用语按照给定的HQL语句查询
     * @param hql hql语句
     * @param values 数量可变的参数
     * @return
     */
    @SuppressWarnings("unchecked")
    List find(String hql, Object... values);
  
    /**
     * 该方法获取所有对象列表，对象没有重复.
     * <p>注意，如果要使用该方法，model必须要正确地实现了hashcode和equals两个方法</p>
     * @return 对象列表
     */
    @SuppressWarnings("unchecked")
    List getAllDistinct(Class clazz);
	
	/**
     * 通过已命名的查询查询
     * @param queryName 已命名的查询的名称
     * @param queryParams 查询名值对
     * @return 找到的结果列表
     */
    @SuppressWarnings("unchecked")
    List findByNamedQuery(String queryName, Map<String, Object> queryParams) throws Exception;
     
}
